﻿Public Class Abm_editoriales
        Enum estado
            modificar
            insertar
            consultar
        End Enum

        Dim proximoId As Integer
        Dim datos As AccesoADatos
        Dim carga As ManejoDeCarga
        Dim editar As estado

    Private Sub Abm_editoriales_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        datos = New AccesoADatos()
        carga = New ManejoDeCarga()
        carga_grilla("")
        modo(estado.consultar)
        ToolTip1.SetToolTip(Me.btn_nuevo, "Crear un nuevo registro")
        ToolTip1.SetToolTip(Me.btn_modificar, "Modificar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_eliminar, "Eliminar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_buscar, "Realizar búsqueda")
        ToolTip1.SetToolTip(Me.btn_cancelar, "Cancelar la operación actual")
        ToolTip1.SetToolTip(Me.btn_guardar, "Guardar los datos cargados")
        ToolTip1.SetToolTip(Me.btn_salir, "Salir del formulario")
    End Sub

    Private Sub carga_grilla(ByRef where As String)
        If where = "" Then
            carga.cargarGrilla(dgv_editoriales, "nombre as Editorial, pais as País, id_editorial ", "Editorial")
        Else
            carga.cargarGrilla(dgv_editoriales, "nombre as Editorial, pais as País, id_editorial", "Editorial", where)
        End If
        dgv_editoriales.Columns(2).Visible = False
    End Sub

        Private Sub modo(ByRef e As estado)
            editar = e
            Select Case e
                Case estado.consultar
                Me.btn_buscar.Enabled = True
                Me.txt_nombre.Enabled = False
                Me.txt_pais.Enabled = False
                btn_guardar.Enabled = False
                Me.txt_buscarNombre.Enabled = True
                Me.txt_buscarPais.Enabled = True
                Me.dgv_editoriales.Enabled = True
                pnl_controlesCarga.Enabled = True
                pnl_controlesConfirmacion.Enabled = False
                    Exit Select
                Case estado.insertar
                Me.btn_buscar.Enabled = False
                Me.txt_nombre.Enabled = True
                Me.txt_pais.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarNombre.Enabled = False
                Me.txt_buscarPais.Enabled = False
                Me.dgv_editoriales.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                    Exit Select
                Case estado.modificar
                Me.btn_buscar.Enabled = False
                Me.txt_nombre.Enabled = True
                Me.txt_pais.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarNombre.Enabled = False
                Me.txt_buscarPais.Enabled = False
                Me.dgv_editoriales.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                    Exit Select
            End Select
        End Sub

        Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
            Me.calcular_proximo_id()
            Me.modo(estado.insertar)
        Me.limpiar_campos()
        Me.txt_nombre.Focus()
        End Sub

        Private Sub calcular_proximo_id()
            Dim tabla As New Data.DataTable
        tabla = datos.leerTabla("MAX(id_editorial)", "Editorial")
            proximoId = tabla.Rows(0)(0) + 1
        End Sub

        Private Sub btn_modificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_modificar.Click
            modo(estado.modificar)
        Dim pk As Integer = Me.dgv_editoriales.CurrentRow.Cells(2).Value
            Dim dt As New Data.DataTable
        dt = datos.leerTabla("*", "Editorial", "id_editorial = " & pk)
            Me.txt_nombre.Text = dt.Rows(0)("nombre")
        Me.txt_pais.Text = dt.Rows(0)("pais")
        Me.txtpk.Text = pk
    End Sub

        Private Sub btn_Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If MessageBox.Show("¿Esta seguro que desea borrar la editorial seleccionada?", "Importante", _
                                                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
            datos.borrarRegistro("Editorial", "id_editorial", Me.dgv_editoriales.CurrentRow.Cells(2).Value)
            modo(estado.consultar)
            limpiar_campos()
        End If
        End Sub

        Private Sub limpiar_campos()
            txt_nombre.Clear()
        txt_pais.Clear()
        txt_buscarNombre.Clear()
        txt_buscarPais.Clear()
            carga_grilla("")
        End Sub

        Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
            Dim mensaje As String = "¿Esta seguro que desea cancelar la operación actual?"
            If editar = estado.consultar Then
                mensaje = "¿Cancelar la búsqueda?"
            End If
            If MessageBox.Show(mensaje, "Confirmación", MessageBoxButtons.YesNo, _
                               MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
                modo(estado.consultar)
                limpiar_campos()
            End If
        End Sub

        Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
            If validar_carga() Then
                If editar = estado.insertar Then
                If insertar_editorial() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    proximoId += 1
                    MessageBox.Show("Editorial agregada correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                If modificar_editorial() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    MessageBox.Show("Editorial modificada correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End If
    End Sub

    Private Function validar_carga() As Boolean
        If validar_vacios() Then
            If validar_contenido() Then
                Return True
            End If
        End If
        Return False
    End Function

    Private Function validar_existencia() As Boolean
        If datos.leerTabla("*", "Editorial", "nombre= '" & txt_nombre.Text & "' and pais = '" & txt_pais.Text & "'").Rows.Count() <> 0 Then
            MessageBox.Show("Ya existe una editorial con el nombre ingresado", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_vacios() As Boolean
        Dim validacion As Boolean = True
        If txt_nombre.Text = "" Or txt_pais.Text = "" Then
            MessageBox.Show("Debe completar todos los campos", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Function validar_contenido() As Boolean
        If IsNumeric(txt_nombre.Text) Then
            MessageBox.Show("El nombre de editorial debe ser texto", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If txt_nombre.Text.Length > 30 Then
            MessageBox.Show("El nombre de editorial es demasiado largo", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If IsNumeric(txt_pais.Text) Then
            MessageBox.Show("El nombre de país debe ser texto", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If txt_pais.Text.Length > 30 Then
            MessageBox.Show("El nombre de país es demasiado largo", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If

        Return True
    End Function

    Private Function insertar_editorial() As Boolean
        Dim exito As Boolean = True
        If validar_existencia() Then
            Dim valores As String = proximoId & ", '" & Me.txt_nombre.Text & "', '" & Me.txt_pais.Text & "'"
            Try
                datos.insertarRegistro("Editorial", valores)
            Catch ex As OleDb.OleDbException
                exito = False
                MessageBox.Show("Error cargando la editorial en la base de datos", "Editorial no agregada", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            exito = False
        End If
        Return exito
    End Function

    Private Function modificar_editorial() As Boolean
        Dim exito As Boolean = True
        Dim valores As String
        valores = "nombre = '" & Me.txt_nombre.Text & "'"
        valores &= ", pais = '" & Me.txt_pais.Text & "'"
        Try
            datos.modificarRegistro("Editorial", valores, "id_editorial", txtpk.Text)
        Catch ex As OleDb.OleDbException
            exito = False
            MessageBox.Show("Debe completar los campos correctamente", "Editorial no modificada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
        Return exito
    End Function

        Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
            If validar_campos_de_busqueda() Then
                Dim clausulas As Integer = 0
                Dim where As String = ""
                If txt_buscarnombre.Text <> "" Then
                    If validarBuscarNombre() Then
                    where = "nombre LIKE '%" & txt_buscarNombre.Text & "%'"
                        clausulas += 1
                    End If
                End If
            If txt_buscarPais.Text <> "" Then
                If validarBuscarPais() Then
                    If clausulas > 0 Then
                        where &= " and pais LIKE '%" & txt_buscarPais.Text & "%'"
                        clausulas += 1
                    Else
                        where = "pais LIKE '%" & txt_buscarPais.Text & "%'"
                        clausulas += 1
                    End If
                End If
            End If
            Try
                carga_grilla(where)
            Catch ex As OleDb.OleDbException
                MessageBox.Show("Debe completar los campos correctamente", "Error de búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                limpiar_campos()
            End Try
        End If
    End Sub
    Private Function validarBuscarNombre() As Boolean
        If IsNumeric(txt_buscarNombre.Text) Then
            MessageBox.Show("El nombre debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
    Private Function validarBuscarPais() As Boolean
        If IsNumeric(txt_buscarPais.Text) Then
            MessageBox.Show("El apellido debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
        Private Function validar_campos_de_busqueda() As Boolean
            Dim validacion As Boolean = True
        If txt_buscarNombre.Text = "" And txt_buscarPais.Text = "" Then
            MessageBox.Show("Debe completar al menos un campo de búsqueda", "Error en la búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
            Return validacion
        End Function

        Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
            If System.Windows.Forms.DialogResult.OK = MessageBox.Show("Cerrar esta ventana?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) Then
                Me.Close()
            End If
    End Sub
End Class

